scrolling and scrollbars

Revision:


Content

definition and usage setting scroll behavior with CSS Javascript - smooth roll scrollbars - introduction scrollbar applications scrolling on Apple devices


definition and usage

top

The scroll-behavior CSS property sets the behavior for a scrolling box when scrolling is triggered by the navigation or CSSOM scrolling APIs. Note that any other scrolls, such as those performed by the user, are not affected by this property. When this property is specified on the "root element", it applies to the viewport instead. This property specified on the "body element" will not propagate to the viewport.

The easiest way to add a smooth scroll animation is to set the scroll behavior property in CSS –e.g. body { scroll-behavior: smooth }

Syntax: scroll-behavior = auto | smooth | initial | inherit;

Syntax examples:

            /* Keyword values */
            scroll-behavior: auto;
            scroll-behavior: smooth;
            
            /* Global values */
            scroll-behavior: inherit;
            scroll-behavior: initial;
            scroll-behavior: revert;
            scroll-behavior: revert-layer;
            scroll-behavior: unset;
        

Values:

auto: the scrolling box scrolls instantly;
smooth: the scrolling box scrolls in a smooth fashion using a user-agent-defined timing function over a user-agent-defined period of time. User agents should follow platform conventions, if any.


setting scroll behavior with CSS

top

smooth scroll behavior

1
2
3
code:
          <div>
            <nav>
              <a class="navigation" href="#page-1">1</a>
              <a class="navigation" href="#page-2">2</a>
              <a class="navigation" href="#page-3">3</a>
            </nav>
            <div class="scroll-container">
              <div class="scroll-page" id="page-1">1</div>
              <div class="scroll-page" id="page-2">2</div>
              <div class="scroll-page" id="page-3">3</div>
            </div>
          </div>
          <style>
              .navigation{display: inline-block; width: 5vw; text-decoration: none;}
              .navigation, .scroll-container {display: block; margin: 0 auto; text-align: center;}
              .navigation { width: 30vw; padding: 0.5vw; border: 0.1vw solid blue;}
              .scroll-container { width: 35vw; height: 20vw; overflow-y: scroll; scroll-behavior: smooth;}
              .scroll-page { display: flex; align-items: center; justify-content: center; height: 100%; font-size: 5vw;}
          </style>
        

"scroll-behavior" property

Section 1

Click on the link to see the "smooth" scrolling effect.

Click me to smooth scroll to section 2 below

Note: Remove the scroll-behavior property to remove smooth scrolling.

code:
          <div>
            <div class="main" id="section1">
                <h3>Section 1</h3>
                <p class="spec">Click on the link to see the "smooth" scrolling effect.</p>
                <a href="#section2">Click me to smooth scroll to section 2 below</a>
                <p>Note: Remove the scroll-behavior property to remove smooth scrolling.</p>
            </div>
            <div class="main" id="section2">
                <h3>Section 2</h3>
              <a href="#section1">Click me to smooth scroll to section 1 above</a>
            </div>
          </div>
          <style>
              html {scroll-behavior: smooth;}
                #section1 {height: 40vw; background-color: pink;}
                #section2 {height: 40vw; background-color: yellow;}
          </style>
        

scrolling text

The power of anchors

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed mattis justo ex, nec commodo metus pellentesque quis. Suspendisse lobortis eros elit, nec consequat sem posuere et. Aenean varius facilisis elit, a mattis ante bibendum a. Ut eu eleifend velit. Donec accumsan placerat massa quis egestas. Praesent vitae maximus nisl. Nulla ut dui quis purus tincidunt porta nec id eros. Vivamus in metus quis eros gravida finibus in sit amet elit. Maecenas eu sagittis augue. Nulla ut dolor et turpis vestibulum bibendum id at augue. Etiam eu faucibus sem.

Mauris nec magna nisi. Maecenas nec leo ullamcorper tellus eleifend lobortis. Nulla risus orci, porta non diam vitae, posuere efficitur risus. Sed lorem dolor, imperdiet quis condimentum in, posuere quis arcu. Aliquam ex ligula, blandit non elementum non, molestie at metus. Duis vestibulum facilisis leo bibendum vestibulum. Integer ac justo augue. Integer mi turpis, porttitor sit amet orci nec, convallis egestas tortor. Duis convallis sapien ut lorem convallis, nec tristique eros sodales. Quisque placerat elit vel quam condimentum, quis fermentum risus elementum. Donec eget tincidunt nisl, nec laoreet massa. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus at faucibus ligula. Ut eu rhoncus tellus.

Introduction

Aliquam pretium lacus a ex tincidunt, et aliquet magna feugiat. Suspendisse sagittis condimentum pretium. Aenean a scelerisque arcu, consequat aliquet felis. Cras dictum nulla nec odio tincidunt faucibus. Nullam nec fermentum elit. Duis in velit vitae felis euismod dignissim ullamcorper non nisl. Nullam malesuada faucibus malesuada. Duis sem velit, viverra et diam tempus, convallis sodales orci. Mauris gravida eros at lorem varius dignissim. Vivamus nec nibh lorem.

Curabitur aliquet leo mi, non molestie orci mollis ut. Curabitur pretium, turpis rutrum tempus mattis, ex tellus lobortis sapien, vel vehicula urna purus ut ex. Sed at nisl sit amet nibh auctor hendrerit quis non est. Praesent hendrerit dui consectetur nisi lacinia, tincidunt scelerisque nunc condimentum. Etiam imperdiet nibh sed orci efficitur auctor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec scelerisque neque quis lacus facilisis elementum. Sed nisl justo, vulputate non diam id, ornare luctus ligula. Praesent metus felis, feugiat non sapien eget, commodo aliquet risus. Integer congue lacinia nulla, ut vulputate augue. Suspendisse risus ex, eleifend at velit eget, ultricies hendrerit sem. Integer sit amet tincidunt erat, sed convallis sem.

Conclusion

Nam tristique mi eu lectus rutrum, vel porta magna pharetra. Vestibulum dictum leo dolor, non sagittis arcu elementum nec. Cras commodo erat sit amet dolor efficitur, a eleifend libero ultrices. Vivamus facilisis bibendum posuere. Etiam ornare massa sit amet blandit pharetra. Ut vel egestas mi. Duis tempor massa elit. Nulla nec neque magna. Vestibulum posuere facilisis justo, egestas vulputate neque pellentesque sit amet.

Back to top
code:
      <main>
          <ul>
            <li><a href="#introduction">Introduction</a></li>
            <li><a href="#conclusion">Conclusion</a></li>
          </ul>

          <p>
            Lorem ipsum dolor sit amet... Etiam eu faucibus sem.
          </p>

          <p>
            Mauris nec magna nisi. ... Ut eu rhoncus tellus.
          </p>

          <h2 class="text" id="introduction">Introduction</h2>

          <p>
            Aliquam pretium lacus a ex tincidunt,... Vivamus nec nibh lorem.
          </p>

          <p>
            Curabitur aliquet leo mi, ... sed convallis sem.
          </p>

          <h2 class="text" id="conclusion">Conclusion</h2>

          <p>
            Nam tristique mi eu lectus rutrum,...egestas vulputate neque pellentesque sit amet.
          </p>

          <a id="to-top" href="#">Back to top</a>
      </main>
      <style>
          /* scrolling text */
          :root {--blue: #74bcdd; --dark-blue: #2d3e51; --red: #f74442; --yellow: #fbca32; --green: #5be95b; --grey: #ebeced;}
          html {scroll-behavior: smooth;}
          main{width: 80%; margin-left: 10vw;}
          #to-top {position: fixed; bottom: 1vw; left: 1vw; padding: 1vw 1vw; background-color: var(--dark-blue); 
            color: white; font-size: 1.15vw; font-weight: normal; text-decoration: none; border-radius: 2vw;}
          #to-top:hover {text-decoration: underline;}
      </style>
    


Javascript - smooth roll

top

scroll to a certain position

code:
          <div class="container">
            <button id="top-2" onclick="scrTo(0,250)">scroll to 20vw from top</button>
            <div style="height: 10vw; width: 100%;"></div>
            <button onclick="scrBy(0,100)">scroll down 10vw from current</button>
            <div style="height:10vw; width:100%"></div>
            <button onclick="scrInto('#top')">go to top</button>
          </div>
          <script>
              function scrTo(x, y){
                  window.scroll({
                      left: x, top: y, behavior:"smooth"
                  });
              }
              function scrBy(x, y){
                  window.scrollBy({
                      let: x, top: y, behavior:"smooth" 
                  });
              }
              function scrInto(id){
                  document.querySelector(id).scrollIntoView({
                      behavior:"smooth"
                  });
              }
          </script>
        

legacy JavaScript smooth scroll

code:
          <div>
            <button id="top-3" onclick="sscroll('bottom');">Go to bottom</button>
            <div style="height: 40vw; width: 100%;"></div>
            <button id="bottom" onclick="sscroll('top');">Go to top</button>
          </div>
          <script>
              function sscroll(id) {
              // (A) SCROLL PARAMETERS
              var speed = 10, // Less = faster
                  step = 30, // Less = smoother but slower
                  click = 0;
              
              // (B) GET CURRENT Y POSITION + TARGET Y POSITION
              var fromY = self.pageYOffset ? self.pageYOffset : document.body.scrollTop ;
              var target = document.getElementById(id);
              var toY = target.offsetTop;
              while (target.offsetParent && target.offsetParent != document.body) {
                  target = target.offsetParent;
                  toY += target.offsetTop;
              }
              
              // (C) SCROLL ANIMATION - DOWNWARDS
              if (fromY < toY) {
                  for (var i=fromY; i<=toY; i+=step) {
                  if (i+step > toY) {
                      setTimeout("window.scrollTo(0, " + toY + ")", click * speed);
                  } else {
                      setTimeout("window.scrollTo(0, " + i + ")", click * speed);
                  }
                  click++;
                  }
              }

              // (D) SCROLL ANIMATION - UPWARDS
              else {
                  for (var i=fromY; i>=toY; i-=step) {
                  if (i-step < toY) {
                      setTimeout("window.scrollTo(0, " + toY + ")", click * speed);
                  } else {
                      setTimeout("window.scrollTo(0, " + i + ")", click * speed);
                  }
                  click++;
                  }
              }
              }
            </script>
          


scrollbars - introduction

top

The scrollbar set of CSS properties is a proprietary style hook letting designers create custom themes for the browser's native scrollbars.

Chrome, Edge, Safari and Opera support the non-standard ::-webkit-scrollbar pseudo element, which allows us to modify the look of the browser's scrollbar.

For webkit browsers, you can use the following pseudo elements to customize the browser's scrollbar:

::-webkit-scrollbar: the scrollbar.
::-webkit-scrollbar-button: the buttons on the scrollbar (arrows pointing upwards and downwards).
::-webkit-scrollbar-thumb: the draggable scrolling handle.
::-webkit-scrollbar-track: the track (progress bar) of the scrollbar.
::-webkit-scrollbar-track-piece: the track (progress bar) NOT covered by the handle.
::-webkit-scrollbar-corner: the bottom corner of the scrollbar, where both horizontal and vertical scrollbars meet.
::-webkit-resizer: the draggable resizing handle that appears at the bottom corner of some elements.


scrollbar applications

top

apply the pseudo element

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

code:
            <div>
                <div class="container">
                    <p  class="spec">Lorem ipsum... ipsum </p>
                    <p  class="spec">Lorem ipsum ... ipsum </p>
                    <p  class="spec">Lorem ipsum... ipsum </p>
                    <p  class="spec">Lorem ipsum... ipsum </p>
                    <p  class="spec">Lorem ipsum... ipsum </p>
                    <p  class="spec">Lorem ipsum... ipsum </p>
                    <p  class="spec">Lorem ipsum... ipsum </p>
                    <p  class="spec">Lorem ipsum... ipsum </p>
                    <p  class="spec">Lorem ipsum... ipsum </p>
                    <p  class="spec">Lorem ipsum... ipsum </p>
                    <p  class="spec">Lorem ipsum... ipsum </p>
                    <p  class="spec">Lorem ipsum... ipsum </p>
                    <p  class="spec">Lorem ipsum... ipsum </p>
                    <p  class="spec">Lorem ipsum... ipsum </p>
                    <p  class="spec">Lorem ipsum... ipsum </p>
                    <p  class="spec">Lorem ipsum... ipsum </p>
                    <p  class="spec">Lorem ipsum... ipsum </p>
                    <p  class="spec">Lorem ipsum... ipsum </p>
                    <p  class="spec">Lorem ipsum... ipsum </p>
                    <p  class="spec">Lorem ipsum... ipsum </p>
                    <p  class="spec">Lorem ipsum... ipsum </p>
                    <p  class="spec">Lorem ipsum... ipsum </p>
                </div>
            </div>
            <style>
                .doos{width:40vw; height:40vw; overflow:scroll;}
                .doos::-webkit-scrollbar{width:1vw; background-color:aqua;border-radius:2vw;font-size: 1vw;}
                .doos::-webkit-scrollbar-track {box-shadow: inset 0 0 .6vw rgba(0, 0, 0, 0.3); 
                  -webkit-box-shadow: inset 0 0 .6vw rgba(0, 0, 0, 0.3);}
                .doos::-webkit-scrollbar-thumb {background-color: crimson; outline: .5vw dotted green;}
                .doos::-webkit-scrollbar-thumb:hover { background: green;}
                .doos::-webkit-scrollbar-corner{ background: yellow;}
            </style>
        

hide scrollbars

I have some experience in programming and front-end development. Many years of programming experience have culminated in being able to develop front-end applications, writing articles and making progress in the develsopers community.

I have some experience in programming and front-end development. Many years of programming experience have culminated in being able to develop front-end applications, writing articles and making progress in the develsopers community.
code:
          <div>
              <div class="box">
                  <div>
                      I have some experience... community.
                  </div>
              </div><BR>
              <div class="box box-hide-scrollbar">
                  <div>
                      I have some experience... community.
                  </div>
              </div>
          </div>
          <style>
          .box {width: 30vw; overflow: scroll;}
          .box-hide-scrollbar::-webkit-scrollbar {display: none;}
          .box > div {margin-bottom: 1.5vw; padding: 1vw; background-color: lightgrey; border-radius: 
              1vw; font-size: 1.2vw; width: 50vw;}
          </style>
      

customize srollbars

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

code:
        <div>
            <div class="container">
                <p  class="spec">Lorem ipsum... ipsum </p>
                <p  class="spec">Lorem ipsum ... ipsum </p>
                <p  class="spec">Lorem ipsum... ipsum </p>
                <p  class="spec">Lorem ipsum... ipsum </p>
                <p  class="spec">Lorem ipsum... ipsum </p>
                <p  class="spec">Lorem ipsum... ipsum </p>
                <p  class="spec">Lorem ipsum... ipsum </p>
                <p  class="spec">Lorem ipsum... ipsum </p>
                <p  class="spec">Lorem ipsum... ipsum </p>
                <p  class="spec">Lorem ipsum... ipsum </p>
                <p  class="spec">Lorem ipsum... ipsum </p>
                <p  class="spec">Lorem ipsum... ipsum </p>
                <p  class="spec">Lorem ipsum... ipsum </p>
                <p  class="spec">Lorem ipsum... ipsum </p>
                <p  class="spec">Lorem ipsum... ipsum </p>
                <p  class="spec">Lorem ipsum... ipsum </p>
                <p  class="spec">Lorem ipsum... ipsum </p>
                <p  class="spec">Lorem ipsum... ipsum </p>
                <p  class="spec">Lorem ipsum... ipsum </p>
                <p  class="spec">Lorem ipsum... ipsum </p>
                <p  class="spec">Lorem ipsum... ipsum </p>
                <p  class="spec">Lorem ipsum... ipsum </p>
            </div>
        </div>
        <style>
            .container{width:40vw; height: 30vw; overflow:scroll; overflow:scroll;}
            .container::-webkit-scrollbar {width: 1vw;}
            .container::-webkit-scrollbar-track {background: skyblue;}
            .container::-webkit-scrollbar-thumb {background: orange;}
            .container::-webkit-scrollbar-thumb:hover { background: green;}
        </style>
      

always show scrollbars

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum

code:
              <div class="container-1">
                  <p  class="spec">Lorem ipsum... ipsum </p>
                  <p  class="spec">Lorem ipsum ... ipsum </p>
                  <p  class="spec">Lorem ipsum... ipsum </p>
                  <p  class="spec">Lorem ipsum... ipsum </p>
                  <p  class="spec">Lorem ipsum... ipsum </p>
                  <p  class="spec">Lorem ipsum... ipsum </p>
                  <p  class="spec">Lorem ipsum... ipsum </p>
                  <p  class="spec">Lorem ipsum... ipsum </p>
                  <p  class="spec">Lorem ipsum... ipsum </p>
                  <p  class="spec">Lorem ipsum... ipsum </p>
                  <p  class="spec">Lorem ipsum... ipsum </p>
                  <p  class="spec">Lorem ipsum... ipsum </p>
                  <p  class="spec">Lorem ipsum... ipsum </p>
                  <p  class="spec">Lorem ipsum... ipsum </p>
                  <p  class="spec">Lorem ipsum... ipsum </p>
                  <p  class="spec">Lorem ipsum... ipsum </p>
                  <p  class="spec">Lorem ipsum... ipsum </p>
                  <p  class="spec">Lorem ipsum... ipsum </p>
                  <p  class="spec">Lorem ipsum... ipsum </p>
                  <p  class="spec">Lorem ipsum... ipsum </p>
                  <p  class="spec">Lorem ipsum... ipsum </p>
                  <p  class="spec">Lorem ipsum... ipsum </p>
              </div>
          </div>
          <style>
              .container-1{width:30vw; height: 30vw; overflow-y:scroll; overflow-x:scroll;}
              .container-1::-webkit-scrollbar {width: 1vw;}
              .container-1::-webkit-scrollbar-track {background: darkblue;}
              .container-1::-webkit-scrollbar-thumb {background: burlywood;}
              .container-1::-webkit-scrollbar-thumb:hover { background: red;}
          </style>
        


scroll-driven animations

diagonal scroll

Lorem ipsum dolor sit amet consectetur adipisicing elit.
Pariatur, inventore id distinctio, blanditiis tempora voluptas eligendi delectus voluptate labore rem quibusdam facilis accusantium suscipit unde magnam tempore reiciendis sunt quos quae quo minus repudiandae deleniti dolor excepturi?
Dolorum ea repellendus porro consectetur esse necessitatibus? Eos, maiores?
Dolorum nulla nisi eaque, pariatur alias eius possimus maiores minima deleniti voluptatibus earum similique explicabo distinctio expedita placeat laboriosam! Ipsum quos fugiat sunt tenetur dicta magnam.
Maiores itaque tenetur dolorem aspernatur error, dolore perferendis harum voluptates, voluptate ducimus rem aliquid possimus vitae nemo consequatur, enim nam!
code:
      <div class="outer">
        <div class="inner">
          <section>Lorem ipsum dolor sit amet consectetur adipisicing elit.</section>
          <section>Pariatur, inventore id distinctio, blanditiis tempora voluptas eligendi
           delectus voluptate labore rem quibusdam facilis accusantium suscipit unde magnam tempore 
           reiciendis sunt quos quae quo minus repudiandae deleniti dolor excepturi?</section>
          <section>Dolorum ea repellendus porro consectetur esse necessitatibus? Eos, maiores?
          </section>
          <section>Dolorum nulla nisi eaque, pariatur alias eius possimus maiores minima 
          deleniti voluptatibus earum similique explicabo distinctio expedita placeat laboriosam! 
          Ipsum quos fugiat sunt tenetur dicta magnam.</section>
          <section>Maiores itaque tenetur dolorem aspernatur error, dolore perferendis 
          harum voluptates, voluptate ducimus rem aliquid possimus vitae nemo consequatur, 
          enim nam!</section>
        </div>
      </div>
      <style>
        /* body {background-color: #eee;} */
        .outer {background-color: #fff; border: solid 1px currentcolor; border-radius: 50%;  
          box-shadow:0 -5vmin 5vmin -5vmin #000 inset; height: 67vmin; left: 40%;  
          overflow-x:hidden; overflow-y:auto; position: relative; scrollbar-width: none; 
          top:50%; transform: translate(-100%, -10%) rotate(-45deg); width: 67vmin;
        &::-webkit-scrollbar {display: none;}
        }
        .inner {font-size: 3vmin; transform: rotate(45deg);
          section { margin: 1em; transform:translateX(-30vmin); width: 50vmin;
            &:nth-child(1) {margin-top: 35vmin;}
            &:nth-child(2) {margin-left: 16vmin;}
            &:nth-child(3) {margin-left: 34vmin;}
            &:nth-child(4) {margin-left: 50vmin;}
            &:nth-child(5) {margin-left: 70vmin;}
          }
        }
      </style>
    

scrolling on Apple devices

top

Apple devices use the WebKit engine (Safari). Even Chrome and Firefox on iOS use WebKit under the hood. To ensure smooth, "native-feeling" scrolling, you must optimize for this engine.

1. CSS optimizations

Enable hardware acceleration: force the browser to use the GPU for scrolling elements.

      .scrollable-element {
        transform: translateZ(0);
        /* or */
        will-change: scroll-position;
      }
  

Use "overscroll-behavior": prevents the "rubber-banding" effect from triggering unwanted navigation or refreshes.

        body {
          overscroll-behavior-y: contain;
        }
  

Fix the "100vh" issue: on iOS Safari, "100vh" includes the address bar, causing jumpiness when scrolling. Use the new dynamic viewport units:

      .hero-section {
          height: 100dvh; /* Dynamic viewport height */
      }
  

Avoid "position: fixed" on the body: if you need to lock scrolling (e.g., for a modal), do not set "position: fixed" on the <:body>. Instead, toggle a class that sets "overflow: hidden" and save/restore the scroll position via JS.

Legacy touch scrolling: while mostly automatic now, adding this ensures momentum scrolling on older iOS versions (iOS 12 and below).

  .scroll-container {
    -webkit-overflow-scrolling: touch;
    overflow-y: auto;
  }

2. JavaScript best practices

Passive event listeners: this is the most critical JS optimization. By default, iOS waits to see if your scroll event listener calls "preventDefault()". Marking it as passive tells the browser "I won't stop the scroll," allowing it to scroll immediately.

    javascript
    1 window.addEventListener('scroll', handleScroll, { passive: true });

Debounce or throttle: Never run heavy calculations inside a scroll event. Use "requestAnimationFrame" or a throttle function to limit how often your code runs.

Use intersection observer: instead of listening to scroll events to detect when elements come into view (for lazy loading or animations), use the IntersectionObserver API. It is much more performant.

Avoid layout thrashing: do not read and write to the DOM within the same scroll frame. This forces the browser to recalculate layout constantly, causing jank.

3. Asset & render management

Content visibility: use CSS to skip rendering off-screen content.

    .long-list-item {
      content-visibility: auto;
      contain-intrinsic-size: 500px;
    }

Optimize images: large images are the #1 cause of scroll lag. Use WebP or AVIF formats and implement lazy loading.

  <img src="image.webp" loading="lazy" alt="...">

Font loading: use "font-display: swap" in your CSS to prevent text from being invisible while fonts load, which can shift layout during scroll.

4. Safari-specific quirks

Fixed headers: fixed navigation bars can sometimes flicker on iOS. Ensure they have a background color with opacity (e.g., "rgba(255,255,255,0.9)") rather than transparent, or use "backdrop-filter: blur()".

Input focus: when a user taps an input field, iOS zooms in if the font size is under 16px. Set "font-size: 16px" on inputs to prevent this zoom, which disrupts scroll position.